/* eslint-disable */
import Layers from "@/lang/layers";

/**
 * 对象主体，通常指账号
 * @type {string}
 */
let principal = undefined;
/**
 * 角色
 * @type {[]}
 */
let role = undefined;
/**
 * 权限
 * @type {[]}
 */
let permit = undefined;

/**
 * 前端鉴权
 * <p>
 *
 * 可以将这个直接赋到 windows 对象，方便全局调用。
 * 用于控制前端界面组件的显示隐藏，主要用于对接主流的security、shiro等鉴权框架
 * @constructor
 */
function Security() {
}

/**
 * 对象主体，通常指账号
 *
 * @param p{string} 账号
 */
Security.prototype.setPrincipal = function (p) {
    principal = p;
};

/**
 * 设置角色
 *
 * @param r{[string]} 角色码值列表
 */
Security.prototype.setRole = function (r) {
    role = r;
};

/**
 * 设置权限
 *
 * @param p{[string]} 权限码值列表
 */
Security.prototype.setPermit = function (p) {
    permit = p;
};

/**
 * permitAll，允许全部，永远返回 true
 *
 * @returns {boolean}
 */
Security.prototype.permitAll = function () {
    return true;
};

/**
 * denyAll，拒绝所有，永远返回 false
 *
 * @returns {boolean}
 */
Security.prototype.denyAll = function () {
    return false;
};

/**
 * anonymous，当前用户是 anonymous 时返回 true
 *
 * @returns {boolean}
 */
Security.prototype.anonymous = function () {
    return principal === 'anonymous';
};

/**
 * rememberMe，当前用户是 rememberMe 用户时返回 true
 *
 * @returns {boolean}
 */
Security.prototype.rememberMe = function () {
    return principal === 'rememberMe';
};

/**
 * authenticated，当前用户不是 anonymous 时返回 true
 *
 * @returns {boolean}
 */
Security.prototype.authenticated = function () {
    return principal !== 'anonymous';
};

/**
 * fullAuthenticated，当前用户既不是 anonymous 也不是 rememberMe 用户时返回 true
 *
 * @returns {boolean}
 */
Security.prototype.fullAuthenticated = function () {
    return principal !== 'anonymous' && principal !== 'rememberMe';
};

/**
 * hasRole(role)，用户拥有指定的角色权限时返回 true
 *
 * @param r{string}
 * @returns {boolean}
 */
Security.prototype.hasRole = function (r) {
    return Layers.contain(role, r);
};

/**
 * hasAnyRole([role1，role2])，用户拥有任意一个指定的角色权限时返回 true
 *
 * @param roles{string|[string]}
 * @returns {boolean}
 */
Security.prototype.hasAnyRole = function (roles) {
    if(Layers.isEmpty(roles)){
        return true;
    } else {
        let arr = Layers.caseToArray(roles);
        for (let i = 0; i < arr.length; i++) {
            if (!Layers.contain(role, arr[i])) {
                return true;
            }
        }
        return false;
    }
};

/**
 * hasAnyRole([role1，role2])，用户拥有所有指定的角色权限时返回 true
 * @param roles{string|[string]}
 * @returns {boolean}
 */
Security.prototype.hasAllRole = function (roles) {
    if(Layers.isEmpty(roles)){
        return true;
    } else {
        let arr = Layers.caseToArray(roles);
        for (let i = 0; i < arr.length; i++) {
            if (!Layers.contain(role, arr[i])) {
                return false;
            }
        }
        return true;
    }
};

/**
 * hasAuthority(authority)，用户拥有指定的权限时返回 true
 * @param authority{string}
 * @returns {boolean}
 */
Security.prototype.hasAuthority = function (authority) {
    if(Layers.isEmpty(authority)){
        return true;
    } else {
        return Layers.contain(permit, authority);
    }
};

/**
 * hasAnyAuthority([authority1,authority2])，用户拥有任意一个指定的权限时返回 true
 * @param authority{string|[string]}
 * @returns {boolean}
 */
Security.prototype.hasAnyAuthority = function (authority) {
    if(Layers.isEmpty(authority)){
        return true;
    } else {
        let arr = Layers.caseToArray(authority);
        for (let i = 0; i < arr.length; i++) {
            if (Layers.contain(permit, arr[i])) {
                return true;
            }
        }
        return false;
    }
};

/**
 *
 * hasAllAuthority([authority1,authority2]), 用户拥有所有指定的权限时返回 true
 * @param authority{string|[string]}
 * @returns {boolean}
 */
Security.prototype.hasAllAuthority = function (authority) {
    if(Layers.isEmpty(authority)){
        return true;
    } else {
        let arr = Layers.caseToArray(authority);
        for (let i = 0; i < arr.length; i++) {
            if (!Layers.contain(permit, arr[i])) {
                return false;
            }
        }
        return true;
    }
};

/**
 * hasIpAddress('192.168.1.0')，请求发送的 IP 匹配时返回 true。
 *
 * 功能暂未实现，浏览器获取本机IP的方法未确定，而且这个函数是否有存在价值也未确定。
 * @returns {boolean}
 */
Security.prototype.hasIpAddress = function () {
    throw 'un-achieved method!';
};

const security = new Security();
// 全局调用可能会更好些
window.security = security;
export default security;
